package linkedlist;

/**
 * 链表则是一个链表对象连接一个链表对象的数据结构
 * 此链表为单向链表
 */

class LinkedList_Test{

    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.add(1,1);
        linkedList.add(2,2);
//        linkedList.reverse();
        linkedList.list();
    }
}

public class LinkedList {
    // 链表编号
    private  int no;
    // 链表值
    private  Object value;
    // 下一个链表
    private  LinkedList next = null;
    // 头链表
    private  LinkedList head = null;


    @Override
    public String toString() {
        return "LinkedList{" +
                "no=" + no +
                ", value=" + value +
                '}';
    }

    public LinkedList() {
        // 初始化头链表
        head = new LinkedList(0,"null");
    }

    // 构造
    private LinkedList(int no, Object value) {
        this.no = no;
        this.value = value;
    }


    /**
     * 链表添加
     * 注意 对链表的任何操作都不可以让当前指针为需要进行操作的元素的位置
     * 而是使用这个元素的上一个位置，即上一个位置的next指针进行操作。 否则会破坏链表结构
     * 对于链表指针操作也不可以直接对头链表进行操作，否则也会破坏链表的结构，好的方法则是使用一个辅助链表指针temp来进行操作
     */
    final public void add(int no ,Object value){
        // 创建需要加入的链表
        next = new LinkedList(no, value);
        // 使用辅助指针代替头指针
        LinkedList temp = head;
        /**
         *  进行循环， 找到链表的末尾，并且将链表的next换成需要加入的链表 ，
         *  当 当前指针的下一个元素 为空时， 则找到了末尾，此时进行插入。
         *  没有找到则将当前指针移位到next。
         */
        while (true){
            if (temp.next == null){
                temp.next = next;
                return;
            }
            temp = temp.next;
        }
    }

    // 展示链表数据
    final public void list(){
        LinkedList temp = head;
        if (temp.next == null){
            System.out.println("链表为空");
            return;
        }
        while (true){
            if (temp.next == null){
                return;
            }
            System.out.println(temp.next);
            temp = temp.next;
        }
    }

    /**
     * 链表删除
     * 使用链表中的特征进行链表的匹配，当 当前指针的next指针的特征匹配上了 ， 则将next指针指向next指针的next 。
     */
    final public void delete(int no){
        LinkedList temp = head;
        if (temp.next == null){
            System.out.println("链表为空");
            return;
        }
        while (true){
            if (temp.next.no == no){
                // 将next指针指向next指针的next
                temp.next = temp.next.next;
                return;
            }
            temp = temp.next;
        }
    }

    /**
     *  类似双向循环链表， 给链表添加临时的pre指针， 将链表的next指针指向 pre指针
     */
    final public void reverse(){
        LinkedList pre = null;
        LinkedList next = null;
        LinkedList temp = head;
        if (head.next == null){
            System.out.println("链表为空");
            return;
        }
        while (temp != null){
            // 将当前指针标位下一个指针
            next = temp.next;
            // 将下一个指针的next指向pre
            temp.next = pre;
            // 将pre指向辅助指针
            pre = temp;
            // 将辅助指针指向下一个指针
            temp = next;
        }
          head = pre;
    }



}
